{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "#%matplotlib notebook"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejemplo: Caso del sesgo sexista en Berkeley U.\n",
    "Disponemos de los datos de solicitud de matriculación en las licenciaturas impartidas en la [Universidad de Berkeley](http://www.berkeley.edu/). Identifican alumno, género, licenciatura solicitada y el resultado dado a la solicitud (aceptación o rechazo).\n",
    "\n",
    "En concreto, en un fichero plano con el formato\n",
    "\n",
    "```\n",
    "65066360L,M,History,Accepted\n",
    "38927813D,W,Physics,Refused\n",
    "47610244N,M,English Liturature,Accepted\n",
    "90737521K,M,English Liturature,Accepted\n",
    "16186831P,W,Mathematics,Refused\n",
    "06742906I,W,Physics,Refused\n",
    "...\n",
    "```\n",
    "\n",
    "Debemos estudiar una acusación, que afirma que Berkeley discrimina a las mujeres."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "¿Cómo comprobarlo? Calculemos el porcentaje de mujeres que se han visto rechazadas, frente al de hombres."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import defaultdict\n",
    "\n",
    "filename = '../../files/berkeleyData.csv'\n",
    "frecs = defaultdict(int)\n",
    "with open(filename) as f:\n",
    "    for i, line in enumerate(f):\n",
    "        if i > 0:\n",
    "            _, gen, _, res = line.strip().split(',')\n",
    "            frecs[(gen, res)] += 1\n",
    "print(\"Procesadas %s solicitudes\" % sum(frecs.values()))\n",
    "for gen in 'WM':\n",
    "    acc = frecs[(gen, 'Accepted')]\n",
    "    ref = frecs[(gen, 'Refused')]\n",
    "    print(\"En genero %s el porcentage de aceptados es %0.5f\" % (gen, acc / (acc + ref)) )\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Visto lo anterior, la dirección del centro se preocupa, y se dispone a reconvenir a los responsables de selección. Pero para ser justos, decide hacer el análisis individualizado por licenciatura, para dirigirse sólo a los departamentos culpables del sesgo. Repitamos el análisis anterior, pero para cada licenciatura."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "filename = '../../files/berkeleyData.csv'\n",
    "frecs = defaultdict(int)\n",
    "with open(filename) as f:\n",
    "    for i, line in enumerate(f):\n",
    "        if i > 0:\n",
    "            _, gen, subj, res = line.strip().split(',')\n",
    "            frecs[(gen, subj, res)] += 1\n",
    "\n",
    "# Recopilamos la lista de asignaturas\n",
    "subjects = list(set([subj for (_, subj, _) in frecs]))  # Usamos set para eliminar repeticiones\n",
    "subjects.sort()  # Los ordenamos, para que siempre salgan en el mismo orden        \n",
    "\n",
    "# Mostramos proporcion de aceptaciones por subject y genero\n",
    "for subj in subjects:\n",
    "    for gen in 'WM':\n",
    "        acc = frecs[(gen, subj, 'Accepted')]\n",
    "        ref = frecs[(gen, subj, 'Refused')]\n",
    "        print(\"En '%s' y genero %s el porcentage de aceptados es %0.5f\" % (subj, gen, acc / (acc + ref)) )\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hacemos un gráfico de barras."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import FuncFormatter\n",
    "\n",
    "generos = {\n",
    "    'W': 'Mujeres',\n",
    "    'M': 'Hombres',\n",
    "}\n",
    "\n",
    "def to_percent(y, position):\n",
    "    \"\"\"Produce numeros en porcentaje, sin trailing 0s\"\"\"\n",
    "    return str(100 * y).rstrip('0').rstrip('.') + '%'\n",
    "\n",
    "\n",
    "plt.figure(1, figsize = (10,5))  # Dimensiones zona plot\n",
    "axes = plt.gca()\n",
    "\n",
    "ancho = 0.3\n",
    "nDatos = len(subjects)\n",
    "x_pos = np.linspace(ancho, ancho*nDatos, nDatos)  # Alturas a las que va cada barra\n",
    "\n",
    "# Rangos abarcados en los ejes\n",
    "axes.set_xlim([(1-0.5)*ancho, ancho*(nDatos+0.5)])\n",
    "axes.set_ylim([0, 0.95])\n",
    "\n",
    "# Porcentajes en el eje X\n",
    "axes.yaxis.set_major_formatter(FuncFormatter(to_percent))\n",
    "\n",
    "# Plots por sexo\n",
    "for gen, offset, col in ( ('W', -0.16*ancho, 'r'), ('M', +0.16*ancho, 'b') ):\n",
    "    xs = x_pos + offset\n",
    "    ratio = []\n",
    "    for subj in subjects:\n",
    "        acc = frecs[(gen, subj, 'Accepted')]\n",
    "        ref = frecs[(gen, subj, 'Refused')]\n",
    "        ratio.append( acc / (acc + ref) )\n",
    "    plt.bar(xs, height=ratio, width=0.3*ancho, color=col, label=generos[gen], xerr=None, align='center', alpha=0.4)\n",
    "\n",
    "# Settings generales de la grafica\n",
    "plt.xticks(x_pos, subjects)  # Cambio en los xticks: ponemos las licenciaturas\n",
    "plt.xlabel('Licenciatura')\n",
    "plt.ylabel('Ratio Aceptación')\n",
    "plt.title('Solicitudes matriculación Berkeley U.')\n",
    "plt.legend(loc=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Resulta que en todas y cada una de las licenciaturas el porcentaje de hombres rechazados es mayor que el de mujeres. No hay discriminación contra ellas."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Los datos utilizados **no son reales** (de hecho, ¡están generados por un script Python!). Pero la paradoja sí, se conoce como [Paradoja de Simpson](https://en.wikipedia.org/wiki/Simpson%27s_paradox), y en efecto se dio en Berkeley con las matriculaciones de 1973."
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
